package Negocio;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import javax.persistence.*;

import org.hibernate.annotations.Cascade;

import VO.CotizacionVO;

import Controlador.CPR;
import ControladorPersistencia.AdminGanacia;
import ControladorPersistencia.AdminProveedor;
import ControladorPersistencia.AdminRodamiento;
import Dao.CotizacionDao;
import Dao.SolicitudCompraDao;

@Entity
@Table(name="Cotizacion")
public class Cotizacion {
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	@OneToOne
	@JoinColumn(name="compPrecios")
	private ListaPreciosCPR compPrecios;
	
	@Column(name = "iva", columnDefinition = "decimal(10,2)")
	private float iva;
	@Column(name = "ingBrutos", columnDefinition = "decimal(10,2)")
	private float ingBrutos;
	
	@OneToOne
	@JoinColumn(name="solicitudRodamientos")
	private SolicitudRodamientos solitudRodamientos;
	private Date fecha;
	private int tiempoValidez;
	@Column(name = "totalSinDescuento", columnDefinition = "decimal(10,2)")
	private float totalSinDescuento;
	@Column(name = "totalConDescuento", columnDefinition = "decimal(10,2)")
	private float totalConDescuento;
	
	@OneToMany(cascade=CascadeType.ALL)
	@JoinColumn(name="cotizacion")
	private List<ItemCotizacion> items;
	
	private Float descuentoPorc;
	@Column(name = "aprobado", columnDefinition = "int")
	private boolean aprobado;
	
	public Cotizacion() {
		super();
	}

	public Cotizacion(SolicitudRodamientos solitudRodamientos, int tiempoValidez) throws Exception {
		super();
		this.solitudRodamientos = solitudRodamientos;
		this.fecha = new Date();
		this.tiempoValidez = tiempoValidez;
		this.totalSinDescuento = 0;
		this.totalConDescuento = 0;
		this.items = new ArrayList<ItemCotizacion>();
		this.aprobado = false;
		CotizacionDao.getInstancia().salvar(this);
		calcularCotizacion();
		CotizacionDao.getInstancia().actualizar(this);
	}
	


	public void calcularCotizacion() throws Exception{
		
		totalSinDescuento = 0;
		
		ItemSolicitud itemSol = null;
		List<ItemSolicitud> itemsSol = this.solitudRodamientos.getItemsSolicitud();
		Iterator<ItemSolicitud> it = itemsSol.iterator();
		
		while(it.hasNext()){
			itemSol = it.next();
			Rodamiento rod = itemSol.getRodamiento();
			
			String marca = rod.getMarca();
			String origen = rod.getOrigen();
			ArrayList<ItemListaPreciosCPR> comparativa = AdminProveedor.getInstance().obtenerPreciosRodamiento(rod.getCodigo(), marca, origen);
			if(comparativa!=null && comparativa.size()>0)
			{
				ItemListaPreciosCPR ilp = comparativa.get(0);
				Float precio = ilp.getPrecioUnitario();
				int cantidad = itemSol.getCantidad();
				ItemCotizacion itemCot = new ItemCotizacion(cantidad, precio, rod);
				itemCot.setCotizacion(this);
				itemCot.setNombreLista(ilp.getTipoLista());
				itemCot.setProveedor(ilp.getProveedor());
				items.add(itemCot);
				CotizacionDao.getInstancia().salvarItem(itemCot);
				totalSinDescuento = totalSinDescuento + cantidad * precio;
			}
		}
		
		if(this.solitudRodamientos.getCliente().esReposnsableInscripto()){
			this.iva = (float) (totalSinDescuento * 0.21);
			this.ingBrutos = (float) (totalSinDescuento * 0.04);
		}else{
			this.iva = (float) (totalSinDescuento * 0.21);
			this.totalSinDescuento = (float) (totalSinDescuento + iva);
		}
	}
	

	public int getId() {
		return id;
	}

	public ListaPreciosCPR getCompPrecios() {
		return compPrecios;
	}

	public float getIva() {
		return iva;
	}

	public float getIngBrutos() {
		return ingBrutos;
	}

	public SolicitudRodamientos getSolitudRodamientos() {
		return solitudRodamientos;
	}

	public Date getFecha() {
		return fecha;
	}

	public int getTiempoValidez() {
		return tiempoValidez;
	}

	public float getTotalSinDescuento() {
		return totalSinDescuento;
	}

	public ArrayList<ItemCotizacion> getItems() {
		return new ArrayList<ItemCotizacion> (CotizacionDao.getInstancia().obtenerItems(this));
	}

	public float getTotalConDescuento() {
		return totalConDescuento;
	}

	public void setTotalConDescuento(float totalConDescuento) {
		this.totalConDescuento = totalConDescuento;
	}

	public void SetDescuentoPorcentaje(Float descuento) {
		this.descuentoPorc = descuento;
		
	}

	public Float getDescuentoPorcentaje() {
		return this.descuentoPorc;
	}

	public Float getDescuentoPorc() {
		return descuentoPorc;
	}

	public void setDescuentoPorc(Float descuentoPorc) {
		this.descuentoPorc = descuentoPorc;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setCompPrecios(ListaPreciosCPR compPrecios) {
		this.compPrecios = compPrecios;
	}

	public void setIva(float iva) {
		this.iva = iva;
	}

	public void setIngBrutos(float ingBrutos) {
		this.ingBrutos = ingBrutos;
	}

	public void setSolitudRodamientos(SolicitudRodamientos solitudRodamientos) {
		this.solitudRodamientos = solitudRodamientos;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public void setTiempoValidez(int tiempoValidez) {
		this.tiempoValidez = tiempoValidez;
	}

	public void setTotalSinDescuento(float totalSinDescuento) {
		this.totalSinDescuento = totalSinDescuento;
	}

	public void setItems(List<ItemCotizacion> items) {
		this.items = items;
	}
	
	public boolean isAprobado() {
		return aprobado;
	}

	public void setAprobado(boolean aprobado) {
		this.aprobado = aprobado;
	}
	
	public void aprobarCotizacion(){
		Iterator<ItemCotizacion> items = this.getItems().iterator();
		while(items.hasNext())
		{
			ItemCotizacion item = items.next();
			Integer stock = item.getRodamiento().getStock().getCantidad();
			Integer puntoRep = item.getRodamiento().getStock().getPuntoReposicion();
			// Si tengo stock elimino el Stock del total
			if(stock < item.getCantidad())
			{
				SolicitudCompra s = new SolicitudCompra(new Date(), item.getNombreLista(),item.getProveedor(), this,item.getRodamiento(),item.getCantidad());
				SolicitudCompraDao.getInstancia().salvar(s);
			}
			item.getRodamiento().getStock().addMovimientoBaja(item.getCantidad(), "Items utilizados por cotizacion "+ Integer.toString(this.getId()));
		}
		aprobado = true;
	}
	
	
}
